package model.dominio;

import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * 
 * @author Daniel
 * Classe responsável pelo objeto Pessoa, cujo mapeamento com banco de dados está descrito abaixo.
 */
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "Pessoa")
public class Pessoa implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private Integer codigo = 0;
    @Column(length = 255)
    private String nome;
    @Column(length = 255)
    private String endereco;
    @Column(length = 14)
    private String telefone;
    @Column(length = 14)
    private String cpf;
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data_ultima_alteracao;
    @JoinColumn(name = "codigo_usuario", referencedColumnName = "codigo")
    @ManyToOne(optional = true, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private Usuario usuario;

    /**
     * Construtor base de um objeto da classe.
     * Utilizado para...
     */
    public Pessoa() {
    }

    /**
     * @return the codigo
     */
    public Integer getCodigo() {
        return codigo;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the endereco
     */
    public String getEndereco() {
        return endereco;
    }

    /**
     * @param endereco the endereco to set
     */
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    /**
     * @return the telefone
     */
    public String getTelefone() {
        return telefone;
    }

    /**
     * @param telefone the telefone to set
     */
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    /**
     * @return the cpf
     */
    public String getCpf() {
        return cpf;
    }

    /**
     * @param cpf the cpf to set
     */
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    /**
     * Construtor secundário de objetos da classe. Exige:
     * @param nome
     * @param cpf 
     * Informações obrigatórias de serem passadas no Cadastro.
     */
    public Pessoa(String nome, String cpf) {
        this.nome = nome;
        this.cpf = cpf;
    }

    /**
     * Construtor secundário de objetos da classe. Exige:
     * @param nome
     * @param cpf
     * @param telefone
     * @param endereco 
     * Além das informações obrigatórias, recebe informações adicionais para construção do objeto.
     */
    public Pessoa(String nome, String cpf, String telefone, String endereco) {
        this.nome = nome;
        this.cpf = cpf;
        this.telefone = telefone;
        this.endereco = endereco;
    }

    /**
     * Sobrescrita do método toString()
     * @return nome do objeto Pessoa
     */
    @Override
    public String toString() {
        return this.nome;
    }

    public Calendar getData_ultima_alteracao() {
        return data_ultima_alteracao;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setData_ultima_alteracao(Calendar instance) {
        this.data_ultima_alteracao = instance;
    }

    public void setUsuario(Usuario usuarioLogado) {
        this.usuario = usuarioLogado;
    }
}